// @Creation:	27.04.2012
// @Version:	27.04.2012
// 
// @Contents:	service.go 
//	Абстракция простенького сервиса		   
//
// @cpu:	x86,
// @author:	alexey kurshakov [alexey.kurshakov@gmail.com]
//

package service

import "sync"

// Интерфейс состояние
type StateReader interface {
	GetState() int
}

// Интерфейс рабочего, занимающегося обработкой событий пришедших сервису
type ServiceWorker interface {
	PreWork() (err error)                                // вызывается после запуска сервиса перед другими действиями
	PostWork() (err error)                               // вызывается во время остановки сервиса
	OnIdle(state StateReader)                            // вызывается, если истекло время бездействия системы
	OnDoWork(eventId int, state StateReader) (err error) // рабочий цикл
}

// Интерфейс сервис
type Service interface {
	// Запустить/остановить сервис
	Start() (err error)
	Stop() (err error)

	// Возвращает состояние сервиса
	StateReader

	// Послать событие для обработки в сервис
	SendEvent(eventId int)

	// Установить обработчик состояний
	SetWorker(worker ServiceWorker)

	// Установить/получить времени бездействия для сервиса
	SetName(serviceName string)
	GetName() string

	// Установить/получить времени бездействия для сервиса
	SetSleepTime(sleepTimeMs int)
	GetSleepTime() int
}

// Преобъявленные коды состояний, которые можно передавать сервису
const (
	StateStopped int = 0 // сервис не запущен
	StateReady   int = 1 // сервис запущен, но в данный момент ничего не делает
	StateBreak   int = 2 // отмена последней операции
)

// Преобъявленные коды событий, которые можно послать сервису
const (
	// служебные события
	EventTimeout  int = -1
	EventWake     int = 0
	EventExitReq  int = 1
	EventBreakReq int = 2
	EventDoWork   int = 3
	// начиная с этих и далее можно посылать 
	// обработчику события со своими идентификаторами
)

// Реализация простенького сервиса
type SimpleService struct {
	mutex        sync.Mutex // мьютекс для работы сервиса в мультипоточной среде
	event        chan int
	worker       ServiceWorker // интерфейс "работника"
	name         string        // "имя" сервиса
	currentState int32         // текущее состояние
	sleepTimeMs  int32         // время бездействия для сервиса
}
